package com.imooc.controller;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.imooc.enums.OperatorFriendRequestTypeEnum;
import com.imooc.enums.SearchFriendsStatusEnum;
import com.imooc.pojo.ChatMsg;
import com.imooc.pojo.Users;
import com.imooc.pojo.bo.UsersBO;
import com.imooc.pojo.vo.MyFriendsVO;
import com.imooc.pojo.vo.UsersVO;
import com.imooc.service.UserService;
import com.imooc.utils.FastDFSClient;
import com.imooc.utils.FileUtils;
import com.imooc.utils.IMoocJSONResult;
import com.imooc.utils.MD5Utils;

/***
 *                    _ooOoo_
 *                   o8888888o
 *                   88" . "88
 *                   (| -_- |)
 *                    O\ = /O
 *                ____/`---'\____
 *              .   ' \\| |// `.
 *               / \\||| : |||// \
 *             / _||||| -:- |||||- \
 *               | | \\\ - /// | |
 *             | \_| ''\---/'' | |
 *              \ .-\__ `-` ___/-. /
 *           ___`. .' /--.--\ `. . __
 *        ."" '< `.___\_<|>_/___.' >'"".
 *       | | : `- \`.;`\ _ /`;.`/ - ` : | |
 *         \ \ `-. \_ __\ /__ _/ .-` / /
 * ======`-.____`-.___\_____/___.-`____.-'======
 *                    `=---='
 *
 * .............................................
 *          佛祖保佑             永无BUG
 */
/***
 * @ClassName: UserController
 * @Description:
 * @author: wupeng
 * @date: 2018年12月22日 上午8:24:08
 */
@RestController
@RequestMapping("u")
public class UserController
{

	@Autowired
	private UserService userService;

	@Autowired
	private FastDFSClient fastDFSClient;

	@PostMapping("/registOrLogin")
	public IMoocJSONResult registOrLogin(@RequestBody Users user) throws Exception
	{
		// 0. 判断用户名和密码不能为空
		if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword()))
		{
			return IMoocJSONResult.errorMsg("用户名或密码不能为空");
		}
		// 1. 判断用户名是否存在，如果存在就登录，如果不存在就注册
		boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername());
		Users userResult = null;
		if (usernameIsExist)
		{
			// 1.1 登录
			userResult = userService.queryUserForLogin(user.getUsername(), MD5Utils.getMD5Str(user.getPassword()));
			if (userResult == null)
			{
				return IMoocJSONResult.errorMsg("用户名或密码不正确");
			}
		} else
		{
			// 1.2 注册
			user.setNickname(user.getUsername());
			user.setFaceImage("");
			user.setFaceImageBig("");
			user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
			userResult = userService.saveUser(user);
		}
		UsersVO userVO = new UsersVO();
		BeanUtils.copyProperties(userResult, userVO);
		return IMoocJSONResult.ok(userVO);
	}

	@PostMapping("/uploadFaceBase64")
	public IMoocJSONResult uploadFaceBase64(@RequestBody UsersBO userBO) throws Exception
	{
		// 获取前端传过来的base64字符串，然后转换为文件对象再上传
		String base64Data = userBO.getFaceData();
		String userFacePath = "D:\\faceImg\\" + userBO.getUserId() + "userface64.png";
		FileUtils.base64ToFile(userFacePath, base64Data);

		// 上传文件到fastdfs
		MultipartFile faceFile = FileUtils.fileToMultipart(userFacePath);
		String url = fastDFSClient.uploadBase64(faceFile);
		System.out.println(url);

		// 获取缩略图的url
		String thump = "_80x80.";
		String[] arr = url.split("\\.");
		String thumpImgUrl = arr[0] + thump + arr[1];

		System.out.println(thumpImgUrl);

		// 更新用户头像
		Users user = new Users();
		user.setId(userBO.getUserId());
		user.setFaceImage(thumpImgUrl);
		user.setFaceImageBig(url);

		Users result = userService.updateUserInfo(user);

		return IMoocJSONResult.ok(result);
	}

	@PostMapping("/setNickname")
	public IMoocJSONResult setNickname(@RequestBody UsersBO userBO) throws Exception
	{
		// 判断昵称不能为空
		if (StringUtils.isBlank(userBO.getNickname()))
		{
			return IMoocJSONResult.errorMsg("昵称不能为空");
		}
		// 判断昵称不能为空
		if (userBO.getNickname().length() > 8)
		{
			return IMoocJSONResult.errorMsg("昵称长度不能超过8位");
		}
		Users user = new Users();
		user.setId(userBO.getUserId());
		user.setNickname(userBO.getNickname());

		Users result = userService.updateUserInfo(user);

		return IMoocJSONResult.ok(result);
	}

	/**
	 * 搜索好友接口，根据账号做匹配查询而不是模糊查询
	 */
	@PostMapping("/search")
	public IMoocJSONResult searchUser(String myUserId, String friendUsername) throws Exception
	{
		// 0. 判断myUserId friendUsername不能为空
		if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUsername))
		{
			return IMoocJSONResult.errorMsg("");
		}

		// 前置条件 - 1.搜索的用户如果不存在，返回[无此用户]
		// 前置条件 - 2.搜索的账号是你自己，返回[不能添加自己]
		// 前置条件 - 3.搜索的朋友已经是你的好友，返回[该用户已经是你的好友]
		Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
		if (status == SearchFriendsStatusEnum.SUCCESS.status)
		{
			Users user = userService.queryUserInfoByUsername(friendUsername);
			UsersVO userVO = new UsersVO();
			BeanUtils.copyProperties(user, userVO);
			return IMoocJSONResult.ok(userVO);
		} else
		{
			String errorMsg = SearchFriendsStatusEnum.getMsgByKey(status);
			return IMoocJSONResult.errorMsg(errorMsg);
		}
	}

	/**
	 * 发送添加好友的请求
	 */
	@PostMapping("/addFriendRequest")
	public IMoocJSONResult addFriendRequest(String myUserId, String friendUsername) throws Exception
	{
		// 0. 判断myUserId friendUsername不能为空
		if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUsername))
		{
			return IMoocJSONResult.errorMsg("");
		}
		// 前置条件 - 1.搜索的用户如果不存在，返回[无此用户]
		// 前置条件 - 2.搜索的账号是你自己，返回[不能添加自己]
		// 前置条件 - 3.搜索的朋友已经是你的好友，返回[该用户已经是你的好友]
		Integer status = userService.preconditionSearchFriends(myUserId, friendUsername);
		if (status == SearchFriendsStatusEnum.SUCCESS.status)
		{
			userService.sendFriendRequest(myUserId, friendUsername);
		} else
		{
			String errorMsg = SearchFriendsStatusEnum.getMsgByKey(status);
			return IMoocJSONResult.errorMsg(errorMsg);
		}
		return IMoocJSONResult.ok();
	}

	/**
	 * 查询用户接收到的好友申请
	 */
	@PostMapping("/queryFriendRequests")
	public IMoocJSONResult queryFriendRequests(String userId) throws Exception
	{
		// 0. 判断userId 不能为空
		if (StringUtils.isBlank(userId))
		{
			return IMoocJSONResult.errorMsg("");
		}

		// 查询用户接收到的好友申请
		return IMoocJSONResult.ok(userService.queryFriendRequestList(userId));
	}

	/**
	 * 接收方 通过或者忽略朋友请求
	 */
	@PostMapping("/operFriendRequest")
	public IMoocJSONResult operFriendRequest(String acceptUserId, String sendUserId, Integer operType) throws Exception
	{
		// 0. 判断acceptUserId sendUserId operType 不能为空
		if (StringUtils.isBlank(acceptUserId) || StringUtils.isBlank(sendUserId) || operType == null)
		{
			return IMoocJSONResult.errorMsg("");
		}
		// 1. 如果operType没有对应的枚举值，则直接抛出空错误信息
		if (StringUtils.isBlank(OperatorFriendRequestTypeEnum.getMsgByType(operType)))
		{
			return IMoocJSONResult.errorMsg("");
		}

		if (operType == OperatorFriendRequestTypeEnum.IGNORE.type)
		{
			// 2.判断如果忽略好友请求，则直接删除好友请求的数据库表记录
			userService.deleteFriendRequest(sendUserId, acceptUserId);
		} else if (operType == OperatorFriendRequestTypeEnum.PASS.type)
		{
			// 3.判断如果是通过好友请求，则互相增加好友记录到数据库对应的表，然后删除好友请求的数据库表记录
			userService.passFriendRequest(sendUserId, acceptUserId);
		}

		// 4.数据库查询好友列表
		List<MyFriendsVO> myFriends = userService.queryMyFriends(acceptUserId);
		return IMoocJSONResult.ok(myFriends);
	}

	/**
	 * 查询我的好友列表
	 */
	@PostMapping("/myFriends")
	public IMoocJSONResult myFriends(String userId) throws Exception
	{
		// 0. 判断userId 不能为空
		if (StringUtils.isBlank(userId))
		{
			return IMoocJSONResult.errorMsg("");
		}
		// 1.数据库查询好友列表
		List<MyFriendsVO> myFriends = userService.queryMyFriends(userId);
		return IMoocJSONResult.ok(myFriends);
	}

	/**
	 * 用户手机端获取未签收的消息列表
	 */
	@PostMapping("/getUnReadMsgList")
	public IMoocJSONResult getUnReadMsgList(String acceptUserId) throws Exception
	{
		// 0. 判断userId 不能为空
		if (StringUtils.isBlank(acceptUserId))
		{
			return IMoocJSONResult.errorMsg("");
		}
		// 1.数据库查询列表
		List<ChatMsg> unReadMsgList = userService.getUnReadMsgList(acceptUserId);
		return IMoocJSONResult.ok(unReadMsgList);
	}
}
